package xcmg.device.dao.mapper.delivery;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import xcmg.device.dao.entity.delivery.DeliveryNoteDO;
import xcmg.device.dao.entity.delivery.DeliveryNoteExportDO;
import xcmg.device.service.vo.delivery.DeliveryNoteVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

@Mapper
public interface DeliveryNoteMapper {
    //增加
    int add(DeliveryNoteDO deliveryNoteDO);

    //删除
    int deleteByPrimaryKey(@Param("id") String id);

    //更新
    int update(DeliveryNoteDO deliveryNoteDO);
    //调整时更新发货通知单的审核状态，包括审核人，审核时间，审核状态，审核意见如果不传参数就认为是重新置空
    int update4Adjust(DeliveryNoteDO deliveryNoteDO);

    //更新出库状态
    void updateIsOut(@Param("id") String id,@Param("isOut") String isOut,@Param("isOutDesc") String isOutDesc);

    /**
     * 更新for销售冲销（sap相关的值要设置为null，用公共的update担心影响其他地方，所以加了这个）
     * @param deliveryNoteDO
     * @return
     */
    int update4Reverse(DeliveryNoteDO deliveryNoteDO);

    //列表
    List<DeliveryNoteDO> list(DeliveryNoteVO model);

    DeliveryNoteDO itemByNo(@Param("deliveryNoteNo") String deliveryNoteNo, @Param("orgId") String orgId);

    DeliveryNoteDO item(String id);

    int count(@Param("id") String id);

    int countBySaleNo(@Param("saleNo") String saleNo);

    int remove(@Param("ids") List<String> ids);

    int updateStatus(@Param("status") String status, @Param("statusDesc") String statusDesc,@Param("deliveryNo") String deliveryNo);

    DeliveryNoteDO findByDeliveryNo(@Param("deliveryNo") String deliveryNo, @Param("orgId") String orgId);

    DeliveryNoteDO findBySapOutNo(@Param("sapOutBill") String sapOutBill, @Param("orgId") String orgId);

    /**
     * 修改退货状态
     *
     * @param deliveryId String 发货单主键ID
     * @param status     Integer 退货状态（0未退货，1退货中，2退货完成）
     * @return int
     */
    int updateReturnStatus(@Param("deliveryId") String deliveryId, @Param("status") Integer status);

    /**
     * 根据销售意向单号更新发货单退货状态
     *
     * @param saleNo String 销售单号
     * @param status Integer 退货状态（0未退货，1退货中，2退货完成）
     * @return int
     */
    int updateReturnStatusBySaleNo(@Param("saleNo") String saleNo, @Param("status") Integer status);

    //sap过账更新
    int updateSap(DeliveryNoteDO deliveryNoteDO);

    int updateReverseState(@Param("orderList") List<String> orderList, @Param("reverseState") Integer reverseState, @Param("orgId") String orgId);

    //sap删除过账单
    int removeSap(@Param("id") String id);

    int updateReverseSuccess(@Param("isReverseSuccess") Integer isReverseSuccess, @Param("sapOutBill") String sapOutBill, @Param("orgId") String orgId);

    /**
     * 获取该公司下所有需要过账的发货通知单
     *
     * @param orgId
     * @return
     */
    List<DeliveryNoteDO> list4SapPost(@Param("orgId")String orgId);

    String findUserSapCode(@Param("id") String id);

    int updateTicketState(@Param("id") String id, @Param("ticketDate") Date ticketDate,@Param("postDate") Date postDate);

    int findOutStatus(@Param("billId") String billId);

    List<DeliveryNoteDO> listForWJ(@Param("orgId")String orgId, @Param("keyWords")String keyWords, @Param("outLocation")String outLocation,@Param("warehousePermitList")List<String> warehousePermitList);

    List<String> findIdsForAdjust(@Param("saleNo") String saleNo, @Param("orgId") String orgId);

    int updateIsReady(@Param("ids") List<String> ids);

    int findNotSubmit(@Param("ids") List<String> ids);

    List<DeliveryNoteExportDO> exportAllList(DeliveryNoteVO model);

    /**
     * 查询销售意向saleNo下除了主键为deliveryId之外的有效的发货通知单数量
     *
     * @param saleNo
     * @param deliveryId
     * @return
     */
    Integer countActiveDelivery(@Param("saleNo")String saleNo, @Param("deliveryId")String deliveryId);

    /**
     * 更新sapLaunch字段的值
     * @param id
     * @param sapLaunch
     */
    void updateSapLaunch(@Param("id") String id,@Param("sapLaunch") Integer sapLaunch );

    //根据销售订单号获取根据此销售订单创建的发货通知单尾差金额之和
    BigDecimal sumCashAndOverBySaleNo(@Param("saleNo") String saleNo);
    //根据销售订单号获取根据此销售订单创建的排除指定发货通知单id的货通知单尾差金额之和
    BigDecimal sumCashAndOverBySaleNoRemove(@Param("saleNo") String saleNo,@Param("removeDeliveryNoteId") String removeDeliveryNoteId);

    List<DeliveryNoteDO> selectDeliveryReviewStateByIds(@Param("ids") List<String> ids);

    int updateReviewState(@Param("ids") List<String> ids, @Param("reviewState") Integer reviewState,
                          @Param("auditRemark") String auditRemark,@Param("userId") String userId,@Param("userName") String userName);

    Integer countAuditData(@Param("orgId") String orgId);

    int updateDeliveryNoteMaterialsLineNo(String saleNo);
}